home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 44
/
PCMania CD44_1.iso
/
pcmania
/
treal44
/
3dtoshi
/
w3d.asm
< prev
next >
Wrap
Assembly Source File
|
1995-12-01
|
20KB
|
1,195 lines
; w3d.asm
;
; Copyright (c) 1995 by Toshiaki Tsuji, all rights reserved.
PUBLIC SetViewRegion_, SetLeftRight_, SetIntensities_, SetGShadeTable_
PUBLIC SetUData_, SetVData_, SetImageBuffer_, SetFShadeTable_
PUBLIC DrawSimpleTriangle_, DrawClippedTriangle_
PUBLIC DrawGShadeTriangle_, DrawClippedGShade_
PUBLIC DrawTexTriangle_, DrawClippedTex_
PUBLIC DrawFTexTriangle_, DrawClippedFTex_
PUBLIC DrawGTexTriangle_, DrawClippedGTex_
.DATA
x1 DD 0
x2 DD 0
Vx1 DD 0
Vx2 DD 0
Dx1 DD 0
Dx2 DD 0
I1 DD 0
I2 DD 0
dI1 DD 0
dI2 DD 0
DeltaI DD 0
ShadeTable DD 0
FShadeTable DD 0
AddDest DD 0
Color DD 0
TempVar DD 0
DestBuffer DD 0
TriWd DD 0
ImageBuffer DD 0
u1 DD 0
u2 DD 0
v1 DD 0
v2 DD 0
Tmpu1 DD 0
Tmpv1 DD 0
Du1 DD 0
Du2 DD 0
Dv1 DD 0
Dv2 DD 0
DeltaU DD 0
DeltaV DD 0
LoopCount DD 0
.CODE
.386
; VOID SetUData ( LONG u1, LONG u2, LONG Du1, LONG Du2 )
;
; EAX = u1, EDX = u2, EBX = Du1, ECX = Du2
SetUData_ PROC C
mov u1, EAX
mov u2, EDX
mov Du1, EBX
mov Du2, ECX
ret
SetUData_ ENDP
; VOID SetVData ( LONG v1, LONG v2, LONG Dv1, LONG Dv2 )
;
; EAX = v1, EDX = v2, EBX = Dv1, ECX = Dv2
SetVData_ PROC C
mov v1, EAX
mov v2, EDX
mov Dv1, EBX
mov Dv2, ECX
ret
SetVData_ ENDP
; VOID SetImageBuffer ( BYTE *Buffer )
;
; EAX = Buffer
SetImageBuffer_ PROC C
mov ImageBuffer, EAX
ret
SetImageBuffer_ ENDP
; VOID SetViewRegion ( LONG x1, LONG x2 )
;
; EAX = x1, EDX = x2
SetViewRegion_ PROC C
mov Vx1, EAX
mov Vx2, EDX
ret
SetViewRegion_ ENDP
; VOID SetLeftRight ( LONG x1, LONG x2, LONG Dx1, LONG Dx2 )
;
; EAX = x1, EDX = x2, EBX = Dx1, ECX = Dx2
SetLeftRight_ PROC
mov x1, EAX
mov x2, EDX
mov Dx1, EBX
mov Dx2, ECX
ret
SetLeftRight_ ENDP
; VOID SetGShadeTable ( BYTE *Table )
;
; EAX = Table
SetGShadeTable_ PROC C
mov ShadeTable, EAX
ret
SetGShadeTable_ ENDP
; VOID SetFShadeTable ( BYTE *Table )
;
; EAX = Table
SetFShadeTable_ PROC C
mov FShadeTable, EAX
ret
SetFShadeTable_ ENDP
; VOID SetIntensities ( LONG I1, LONG I2, LONG dI1, LONG dI2 )
;
; EAX = I1, EDX = I2, EBX = dI1, ECX = dI2
SetIntensities_ PROC
mov I1, EAX
mov I2, EDX
mov dI1, EBX
mov dI2, ECX
ret
SetIntensities_ ENDP
; VOID DrawSimpleTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawSimpleTriangle_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AL, BL
mov AH, AL
mov BX, AX
shl EAX, 16
mov AX, BX
mov Color, EAX
mov EBP, ECX
cld
LoopSimple :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
mov ECX, EBX
sub ECX, EAX
inc ECX
mov DestBuffer, EDI
mov ESI, ECX
shr ECX, 2
and ESI, 3
add EDI, EAX
mov EAX, Color
rep stosd
mov ECX, ESI
rep stosb
mov EAX, Dx1
mov EBX, Dx2
mov EDI, DestBuffer
add x1, EAX
add x2, EBX
add EDI, EDX
dec EBP
jnz LoopSimple
EndDrawSimple :
pop ESI
pop EDI
pop EBP
ret
DrawSimpleTriangle_ ENDP
; VOID DrawClippedTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawClippedTriangle_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AL, BL
mov AH, AL
mov BX, AX
shl EAX, 16
mov AX, BX
mov Color, EAX
mov EBP, ECX
cld
LoopClipped :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
; Do clipping
cmp EAX, Vx2
jg SkipThisRow
cmp EBX, Vx1
jl SkipThisRow
cmp EAX, Vx1
jge CheckRight
mov EAX, Vx1
CheckRight :
cmp EBX, Vx2
jle StartDraw
mov EBX, Vx2
StartDraw :
mov ECX, EBX
sub ECX, EAX
inc ECX
mov DestBuffer, EDI
mov ESI, ECX
shr ECX, 2
and ESI, 3
add EDI, EAX
mov EAX, Color
rep stosd
mov ECX, ESI
rep stosb
mov EDI, DestBuffer
SkipThisRow :
mov EAX, Dx1
mov EBX, Dx2
add x1, EAX
add x2, EBX
add EDI, EDX
dec EBP
jnz LoopClipped
EndDrawClipped :
pop ESI
pop EDI
pop EBP
ret
DrawClippedTriangle_ ENDP
; VOID DrawGShadeTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawGShadeTriangle_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AddDest, EDX
mov Color, EBX
mov EBP, ECX
cld
LoopGShade :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
mov ECX, EBX
sub ECX, EAX
inc ECX
mov DestBuffer, EDI
add EDI, EAX
mov EAX, I2
mov EBX, I1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv ECX
mov DeltaI, EAX
mov ESI, EBX
mov EAX, Color
push EBP
mov EBP, ShadeTable
LoopInGShade :
mov EBX, ESI
add ESI, DeltaI
shr EBX, 16
mov BL, AL
add EBX, EBP
mov DL, [EBX]
mov [EDI], DL
inc EDI
loop LoopInGShade
pop EBP
mov EAX, Dx1
mov EBX, Dx2
mov EDI, DestBuffer
add x1, EAX
add x2, EBX
add EDI, AddDest
mov EAX, dI1
mov EBX, dI2
add I1, EAX
add I2, EBX
dec EBP
jnz LoopGShade
EndDrawGShade :
pop ESI
pop EDI
pop EBP
ret
DrawGShadeTriangle_ ENDP
; VOID DrawClippedGShade ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawClippedGShade_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AddDest, EDX
mov Color, EBX
mov EBP, ECX
cld
LoopClippedGShade :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
mov ESI, 0
mov ECX, EBX
sub ECX, EAX
inc ECX
mov TriWd, ECX
; Do clipping
cmp EAX, Vx2
jg SkipThisRowClipped
cmp EBX, Vx1
jl SkipThisRowClipped
cmp EAX, Vx1
jge CheckRightClipped
mov ESI, Vx1
sub ESI, EAX
mov EAX, Vx1
CheckRightClipped :
cmp EBX, Vx2
jle StartDrawClipped
sub EBX, Vx2
sub ECX, EBX
mov EBX, Vx2
StartDrawClipped :
mov DestBuffer, EDI
add EDI, EAX
mov EAX, I2
mov EBX, I1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv TriWd
sub ECX, ESI
mov DeltaI, EAX
imul ESI
mov ESI, EBX
add ESI, EAX
mov EAX, Color
push EBP
mov EBP, ShadeTable
LoopInClippedGShade :
mov EBX, ESI
add ESI, DeltaI
shr EBX, 16
mov BL, AL
add EBX, EBP
mov DL, [EBX]
mov [EDI], DL
inc EDI
loop LoopInClippedGShade
pop EBP
mov EDI, DestBuffer
SkipThisRowClipped :
mov EAX, Dx1
mov EBX, Dx2
add x1, EAX
add x2, EBX
add EDI, AddDest
mov EAX, dI1
mov EBX, dI2
add I1, EAX
add I2, EBX
dec EBP
jnz LoopClippedGShade
EndDrawClippedGShade :
pop ESI
pop EDI
pop EBP
ret
DrawClippedGShade_ ENDP
; VOID DrawTexTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawTexTriangle_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AddDest, EDX
mov Color, EBX
mov EBP, ECX
cld
LoopTex :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
mov ECX, EBX
sub ECX, EAX
inc ECX
mov DestBuffer, EDI
add EDI, EAX
mov EAX, u2
mov EBX, u1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv ECX
sar EAX, 8
mov DeltaU, EAX
mov EAX, v2
mov EBX, v1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv ECX
mov DeltaV, EAX
mov ESI, ImageBuffer
mov EAX, u1
shr EAX, 8
push EBP
mov EBP, v1
LoopInTex :
mov EBX, EBP
add EBP, DeltaV
mov BX, AX
add EAX, DeltaU
shr EBX, 8
add EBX, ESI
mov DL, [EBX]
mov [EDI], DL
inc EDI
loop LoopInTex
pop EBP
mov EAX, Dx1
mov EBX, Dx2
mov EDI, DestBuffer
add x1, EAX
add x2, EBX
add EDI, AddDest
mov EAX, Du1
mov EBX, Du2
add u1, EAX
add u2, EBX
mov EAX, Dv1
mov EBX, Dv2
add v1, EAX
add v2, EBX
dec EBP
jnz LoopTex
EndDrawTex :
pop ESI
pop EDI
pop EBP
ret
DrawTexTriangle_ ENDP
; VOID DrawClippedTex ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawClippedTex_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AddDest, EDX
mov Color, EBX
mov EBP, ECX
cld
LoopClippedTex :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
mov ESI, 0
mov ECX, EBX
sub ECX, EAX
inc ECX
mov TriWd, ECX
; Do clipping
cmp EAX, Vx2
jg SkipThisRowClippedTex
cmp EBX, Vx1
jl SkipThisRowClippedTex
cmp EAX, Vx1
jge CheckRightClippedTex
mov ESI, Vx1
sub ESI, EAX
mov EAX, Vx1
CheckRightClippedTex :
cmp EBX, Vx2
jle StartDrawClippedTex
sub EBX, Vx2
sub ECX, EBX
mov EBX, Vx2
StartDrawClippedTex :
mov DestBuffer, EDI
add EDI, EAX
mov EAX, u2
mov EBX, u1
mov Tmpu1, EBX
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv TriWd
mov DeltaU, EAX
imul ESI
add Tmpu1, EAX
sar DeltaU, 8
mov EAX, v2
mov EBX, v1
mov Tmpv1, EBX
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv TriWd
mov DeltaV, EAX
imul ESI
add Tmpv1, EAX
sub ECX, ESI
mov EAX, Tmpu1
sar EAX, 8
mov ESI, ImageBuffer
push EBP
mov EBP, Tmpv1
LoopInClippedTex :
mov EBX, EBP
add EBP, DeltaV
mov BX, AX
add EAX, DeltaU
shr EBX, 8
add EBX, ESI
mov DL, [EBX]
mov [EDI], DL
inc EDI
loop LoopInClippedTex
pop EBP
mov EDI, DestBuffer
SkipThisRowClippedTex :
mov EAX, Dx1
mov EBX, Dx2
add x1, EAX
add x2, EBX
add EDI, AddDest
mov EAX, Du1
mov EBX, Du2
add u1, EAX
add u2, EBX
mov EAX, Dv1
mov EBX, Dv2
add v1, EAX
add v2, EBX
dec EBP
jnz LoopClippedTex
EndDrawClippedTex :
pop ESI
pop EDI
pop EBP
ret
DrawClippedTex_ ENDP
; VOID DrawFTexTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawFTexTriangle_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AddDest, EDX
mov Color, EBX
mov EBP, ECX
cld
LoopFTex :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
mov ECX, EBX
sub ECX, EAX
inc ECX
mov DestBuffer, EDI
add EDI, EAX
mov EAX, u2
mov EBX, u1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv ECX
sar EAX, 8
mov DeltaU, EAX
mov EAX, v2
mov EBX, v1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv ECX
mov DeltaV, EAX
mov ESI, ImageBuffer
mov EAX, u1
shr EAX, 8
push EBP
mov EBP, v1
LoopInFTex :
mov EBX, EBP
mov EDX, 0
mov BX, AX
shr EBX, 8
add EBX, ESI
mov DL, [EBX]
add EDX, FShadeTable
add EAX, DeltaU
add EBP, DeltaV
mov BL, [EDX]
mov [EDI], BL
inc EDI
loop LoopInFTex
pop EBP
mov EAX, Dx1
mov EBX, Dx2
mov EDI, DestBuffer
add x1, EAX
add x2, EBX
add EDI, AddDest
mov EAX, Du1
mov EBX, Du2
add u1, EAX
add u2, EBX
mov EAX, Dv1
mov EBX, Dv2
add v1, EAX
add v2, EBX
dec EBP
jnz LoopFTex
EndDrawFTex :
pop ESI
pop EDI
pop EBP
ret
DrawFTexTriangle_ ENDP
; VOID DrawClippedFTex ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawClippedFTex_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AddDest, EDX
mov Color, EBX
mov EBP, ECX
cld
LoopClippedFTex :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
mov ESI, 0
mov ECX, EBX
sub ECX, EAX
inc ECX
mov TriWd, ECX
; Do clipping
cmp EAX, Vx2
jg SkipThisRowClippedFTex
cmp EBX, Vx1
jl SkipThisRowClippedFTex
cmp EAX, Vx1
jge CheckRightClippedFTex
mov ESI, Vx1
sub ESI, EAX
mov EAX, Vx1
CheckRightClippedFTex :
cmp EBX, Vx2
jle StartDrawClippedFTex
sub EBX, Vx2
sub ECX, EBX
mov EBX, Vx2
StartDrawClippedFTex :
mov DestBuffer, EDI
add EDI, EAX
mov EAX, u2
mov EBX, u1
mov Tmpu1, EBX
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv TriWd
mov DeltaU, EAX
imul ESI
add Tmpu1, EAX
sar DeltaU, 8
mov EAX, v2
mov EBX, v1
mov Tmpv1, EBX
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv TriWd
mov DeltaV, EAX
imul ESI
add Tmpv1, EAX
sub ECX, ESI
mov EAX, Tmpu1
sar EAX, 8
mov ESI, ImageBuffer
push EBP
mov EBP, Tmpv1
LoopInClippedFTex :
mov EBX, EBP
mov EDX, 0
mov BX, AX
shr EBX, 8
add EBX, ESI
mov DL, [EBX]
add EDX, FShadeTable
add EBP, DeltaV
add EAX, DeltaU
mov BL, [EDX]
mov [EDI], BL
inc EDI
loop LoopInClippedFTex
pop EBP
mov EDI, DestBuffer
SkipThisRowClippedFTex :
mov EAX, Dx1
mov EBX, Dx2
add x1, EAX
add x2, EBX
add EDI, AddDest
mov EAX, Du1
mov EBX, Du2
add u1, EAX
add u2, EBX
mov EAX, Dv1
mov EBX, Dv2
add v1, EAX
add v2, EBX
dec EBP
jnz LoopClippedFTex
EndDrawClippedFTex :
pop ESI
pop EDI
pop EBP
ret
DrawClippedFTex_ ENDP
; VOID DrawGTexTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawGTexTriangle_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AddDest, EDX
mov Color, EBX
mov EBP, ECX
cld
LoopGTex :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
mov ECX, EBX
sub ECX, EAX
inc ECX
mov DestBuffer, EDI
add EDI, EAX
mov EAX, u2
mov EBX, u1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv ECX
sar EAX, 8
mov DeltaU, EAX
mov EAX, v2
mov EBX, v1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv ECX
mov DeltaV, EAX
mov EAX, I2
mov EBX, I1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv ECX
mov DeltaI, EAX
mov LoopCount, ECX
mov ECX, I1
mov EAX, u1
shr EAX, 8
mov ESI, ImageBuffer
push EBP
mov EBP, v1
LoopInGTex :
mov EBX, EBP
mov EDX, ECX
add EBP, DeltaV
add ECX, DeltaI
shr EDX, 16
mov BX, AX
add EAX, DeltaU
shr EBX, 8
add EBX, ESI
mov DL, [EBX]
add EDX, ShadeTable
mov BL, [EDX]
mov [EDI], BL
inc EDI
dec LoopCount
jnz LoopInGTex
pop EBP
mov EAX, Dx1
mov EBX, Dx2
mov EDI, DestBuffer
add x1, EAX
add x2, EBX
add EDI, AddDest
mov EAX, Du1
mov EBX, Du2
add u1, EAX
add u2, EBX
mov EAX, Dv1
mov EBX, Dv2
add v1, EAX
add v2, EBX
mov EAX, dI1
mov EBX, dI2
add I1, EAX
add I2, EBX
dec EBP
jnz LoopGTex
EndDrawGTex :
pop ESI
pop EDI
pop EBP
ret
DrawGTexTriangle_ ENDP
; VOID DrawClippedGTex ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
;
; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
DrawClippedGTex_ PROC C
push EBP
push EDI
push ESI
mov EDI, EAX
mov AddDest, EDX
mov Color, EBX
mov EBP, ECX
cld
LoopClippedGTex :
mov EAX, x1
mov EBX, x2
sar EAX, 16
sar EBX, 16
mov ESI, 0
mov ECX, EBX
sub ECX, EAX
inc ECX
mov TriWd, ECX
; Do clipping
cmp EAX, Vx2
jg SkipThisRowClippedGTex
cmp EBX, Vx1
jl SkipThisRowClippedGTex
cmp EAX, Vx1
jge CheckRightClippedGTex
mov ESI, Vx1
sub ESI, EAX
mov EAX, Vx1
CheckRightClippedGTex :
cmp EBX, Vx2
jle StartDrawClippedGTex
sub EBX, Vx2
sub ECX, EBX
mov EBX, Vx2
StartDrawClippedGTex :
mov DestBuffer, EDI
add EDI, EAX
mov EAX, u2
mov EBX, u1
mov Tmpu1, EBX
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv TriWd
mov DeltaU, EAX
imul ESI
add Tmpu1, EAX
sar DeltaU, 8
mov EAX, v2
mov EBX, v1
mov Tmpv1, EBX
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv TriWd
mov DeltaV, EAX
imul ESI
add Tmpv1, EAX
mov EAX, I2
mov EBX, I1
sub EAX, EBX
mov EDX, EAX
sar EDX, 01Fh
idiv TriWd
mov DeltaI, EAX
sub ECX, ESI
mov LoopCount, ECX
mov ECX, I1
imul ESI
add ECX, EAX
mov EAX, Tmpu1
sar EAX, 8
mov ESI, ImageBuffer
push EBP
mov EBP, Tmpv1
LoopInClippedGTex :
mov EBX, EBP
mov EDX, ECX
add EBP, DeltaV
add ECX, DeltaI
shr EDX, 16
mov BX, AX
add EAX, DeltaU
shr EBX, 8
add EBX, ESI
mov DL, [EBX]
add EDX, ShadeTable
mov BL, [EDX]
mov [EDI], BL
inc EDI
dec LoopCount
jnz LoopInClippedGTex
pop EBP
mov EDI, DestBuffer
SkipThisRowClippedGTex :
mov EAX, Dx1
mov EBX, Dx2
add x1, EAX
add x2, EBX
add EDI, AddDest
mov EAX, Du1
mov EBX, Du2
add u1, EAX
add u2, EBX
mov EAX, Dv1
mov EBX, Dv2
add v1, EAX
add v2, EBX
mov EAX, dI1
mov EBX, dI2
add I1, EAX
add I2, EBX
dec EBP
jnz LoopClippedGTex
EndDrawClippedGTex :
pop ESI
pop EDI
pop EBP
ret
DrawClippedGTex_ ENDP
END